<!DOCTYPE HTML>
<html>

<head>
	<link rel="bookmark"  type="image/x-icon"  href="/img/logo.jpg"/>
	<link rel="shortcut icon" href="/img/logo.jpg">
	
			    <title>
    北望你的安
    </title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    <link rel="stylesheet" href="/css/mic_main.css" />
    <link rel="stylesheet" href="/css/dropdownMenu.css" />
    <meta name="keywords" content="北望你的安" />
    
    	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
	 
    <noscript>
        <link rel="stylesheet" href="/css/noscript.css" />
    </noscript>
    <style type="text/css">
        body:before {
          content: ' ';
          position: fixed;
          top: 0;
          background: url('/img/bg.jpg') center 0 no-repeat;
          right: 0;
          bottom: 0;
          left: 0;
          background-size: cover; 
        }
    </style>

			    
  


    <script src="/js/jquery.min.js"></script>
    <script src="/js/jquery.scrollex.min.js"></script>
    <script src="/js/jquery.scrolly.min.js"></script>
    <script src="/js/skel.min.js"></script>
    <script src="/js/util.js"></script>
    <script src="/js/main.js"></script>
	
</head>
    
		
<!-- Layouts -->



<!--  代码渲染  -->
<link rel="stylesheet" href="/css/prism_coy.css" />
<link rel="stylesheet" href="/css/typo.css" />
<!-- 文章页 -->
<body class="is-loading">
    <!-- Wrapper 外包 s-->
    <div id="wrapper" class="fade-in">
        <!-- Intro 头部显示 s -->
        <!-- Intro 头部显示 e -->
        <!-- Header 头部logo start -->
        <header id="header">
    <a href="/" class="logo">Krystalan</a>
</header>
        <!-- Nav 导航条 start -->
        <nav id="nav" class="special" >
            <ul class="menu links" >
			<!-- Homepage  主页  --> 
			<li >
	            <a href="/" rel="nofollow">主页</a>
	        </li>
			<!-- categories_name  分类   --> 
	        
	        <li class="active">
	            <a href="#s1">分类</a>
	                    <ul class="submenu">
	                        <li>
	                        <a class="category-link" href="/categories/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/">强化学习</a></li><li><a class="category-link" href="/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li><a class="category-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a></li><li><a class="category-link" href="/categories/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/">自然语言处理</a></li><li><a class="category-link" href="/categories/%E9%9A%8F%E7%AC%94/">随笔</a>
	                    </ul>
	        </li>
	        
	        <!-- archives  归档   --> 
	        
	        
		        <!-- Pages 自定义   -->
		        
		        <li>
		            <a href="/tags/" title="标签">
		                标签
		            </a>
		        </li>
		        
		        <li>
		            <a href="/gallery/" title="相册">
		                相册
		            </a>
		        </li>
		        


            </ul>
            <!-- icons 图标   -->
			<ul class="icons">
                    
                    <li>
                        <a title="github" href="https://github.com/krystalan" target="_blank" rel="noopener">
                            <i class="icon fa fa-github"></i>
                        </a>
                    </li>
                    
                    <li>
                        <a title="500px" href="https://www.zhihu.com/people/krystalzhu-an" target="_blank" rel="noopener">
                            <i class="icon fa fa-500px"></i>
                        </a>
                    </li>
                    
			</ul>
</nav>

        <div id="main" >
            <div class ="post_page_title_img" style="height: 25rem;background-image: url(/img/9.jpg);background-position: center; background-repeat:no-repeat; background-size:cover;-moz-background-size:cover;overflow:hidden;" >
                <a href="#" style="padding: 4rem 4rem 2rem 4rem ;"><h2 >关键词抽取你的故事</h2></a>
            </div>
            <!-- Post -->
            <div class="typo" style="padding: 3rem;">
                <p><img src="/images/KW/1.jpg" alt="算法总览">  </p>
<p>在介绍关键词抽取之前，先弄清领域短语挖掘、关键词抽取与新词发现的概念与区别：</p>
<blockquote>
<p>（1）关键词抽取是从语料库中提取最重要、最有代表性的短语，抽取的短语数量一般比较少。<br>（2）新词发现的主要目标是发现词汇库中不存在的新词汇。<br>（3）领域短语挖掘指的是从给定的领域语料中自动挖掘该领域的高质量短语的过程。</p>
</blockquote>
<hr>
<h1 id="1-有监督算法"><a href="#1-有监督算法" class="headerlink" title="1.有监督算法"></a>1.有监督算法</h1><p>有监督的关键词抽取算法需要大量的标注数据来让模型习得什么样的词汇是关键词，往往可以看成一个词汇二分类的任务或是一个序列标注任务。（<strong>有监督算法不为本文重点因此只做简单介绍</strong>）  </p>
<h2 id="1-1-词汇二分类任务"><a href="#1-1-词汇二分类任务" class="headerlink" title="1.1 词汇二分类任务"></a>1.1 词汇二分类任务</h2><p>针对于每一个词汇，都为其预测一个结果（是否为关键词），例如我们可以用双向LSTM获取每一个词汇的表示，再用一个激活函数算出预测结果。<br><img src="/images/KW/2.jpg" alt="词汇二分类"><br>例如在本例当中，我们先把“世间安得双全法，不负如来不负卿”分词，之后分别喂给BiLSTM，取得中间的词汇表示（前向LSTM的隐层状态与后向LSTM的隐层状态拼接）后，再利用激活函数计算出分类结果即可。最终我们预测出“双全法”是关键词。</p>
<h2 id="1-2-序列标注任务"><a href="#1-2-序列标注任务" class="headerlink" title="1.2 序列标注任务"></a>1.2 序列标注任务</h2><p>而在序列标注任务解法中，我们可以把每一个词汇都标注成0或1来代表非关键词与关键词，再利用序列模型（例如HMM、CRF等等）求解即可。<br>详细的内容请参考本博客另外一篇文章：<u><a href="https://wangjiaan.xyz/2020/03/09/NER/" target="_blank" rel="noopener">《命名实体识别出你的点点滴滴》</a></u>  </p>
<h1 id="2-无监督算法"><a href="#2-无监督算法" class="headerlink" title="2.无监督算法"></a>2.无监督算法</h1><h2 id="2-1-TF-IDF"><a href="#2-1-TF-IDF" class="headerlink" title="2.1 TF-IDF"></a>2.1 TF-IDF</h2><p>该算法是一个很强的Baseline，能够解决大部分提取关键词的场景。<br>TF = 词语在文章中出现的次数/文章总词数<br>IDF = log[语料库文章总数/(包含该词的文章数+1)]<br>TF-IDF = TF*IDF<br>首先，TF是用来计算词频的，但是计算出来的词频很有可能是一些没有意义的词汇，例如“我们”、“的”、“地”、“得”等等。所以我们要通过IDF来消减这些词的权重。一个词越通用，它的IDF值越低。  </p>
<p>在实战中，我们可以使用jieba.analyse来使用这一算法，具体代码如下： </p>
<pre><code class="python">import jieba.analyse  
data = &#39;就如六世达赖喇嘛仓英嘉措诗中说的一样：“世间安得两全法，不负如来不负卿！”是啊，世界上哪有两全其美的事呢！达赖喇嘛仓英嘉措的人生也是这样，十四岁被西藏摄政王第巴·桑结嘉措认定为五世达赖的转世灵童，从此只能青灯古佛，心向如来了。虽然说达赖喇嘛是西藏人们敬仰的存在，可是仓英嘉措自己想要做吗？&#39;  
keywords = jieba.analyse.extract_tags(data,topK=10)  
print(&#39; &#39;.join(keywords))</code></pre>
<p>需要注意的是，在jieba实现的算法中，默认将使用jieba提供的IDF值，该IDF值是在大量的语料中统计得到的。<br>算法输出如下：  </p>
<pre><code class="python">仓英嘉措 达赖喇嘛 如来 不负 西藏 转世灵童 青灯古佛 第巴 桑结嘉 世达赖</code></pre>
<h2 id="2-2-TextRank"><a href="#2-2-TextRank" class="headerlink" title="2.2 TextRank"></a>2.2 TextRank</h2><p>TextRank是一种基于图的排序算法，其是从PageRank中改进得到的，也可以用于文本摘要任务提取关键句。关键词是关键句的缩写，故依然可以使用。<br>TextRank在构建图模型的时候，节点代表词，节点之间的边代表词之间的共现关系（即取一个窗口，窗口内包含的词之前属于共现关系）<br>计算每个词权重的迭代公式如下：<br><img src="/images/KW/3.jpg" alt="TextRank"><br>其中，d一般取0.85为超参数，In(Vi)表示窗口内有词i的词的集合，Out(Vi)表示词i窗口内所出现的词的集合。<br>实战代码如下，同样还是使用jieba库来实现。</p>
<pre><code class="python">import jieba.analyse  
data = &#39;就如六世达赖喇嘛仓英嘉措诗中说的一样：“世间安得两全法，不负如来不负卿！”是啊，世界上哪有两全其美的事呢！达赖喇嘛仓英嘉措的人生也是这样，十四岁被西藏摄政王第巴·桑结嘉措认定为五世达赖的转世灵童，从此只能青灯古佛，心向如来了。虽然说达赖喇嘛是西藏人们敬仰的存在，可是仓英嘉措自己想要做吗？&#39;  
keywords = jieba.analyse.textrank(data,topK=10)  
print(&#39; &#39;.join(keywords))</code></pre>
<p>输出如下：</p>
<pre><code class="python">达赖喇嘛 西藏 不负 人们 两全 存在 世间 措诗 人生 摄政王</code></pre>
<h2 id="2-3-LDA"><a href="#2-3-LDA" class="headerlink" title="2.3 LDA"></a>2.3 LDA</h2><p>TFIDF是从词频的角度挖掘关键词<br>TextRank是从词共现关系角度挖掘关键词<br>而LDA做为主题模型的一哥，从文档主题的角度挖掘关键词。<br>理论部分请参考本博客另外一篇文章：<u><a href="https://wangjiaan.xyz/2020/03/23/TopicModel" target="_blank" rel="noopener">《一眼看穿你的心思》</a></u>  </p>
<p>实战代码如下：<br>（1）导入所需库</p>
<pre><code class="python">from gensim.models import LdaModel  
import pandas as pd  
from gensim.corpora import Dictionary
import jieba  </code></pre>
<p>（2）获取数据源，这里用的是一个摘要数据集的文章部分，最后的data是一个二维数组，存放每篇文章分完词后结果。</p>
<pre><code class="python">f = open(&#39;data.txt&#39;,&#39;r&#39;,encoding=&#39;utf-8&#39;)  
data = f.readlines()  
f.close()  
data = data[0:100]  
for i,d in enumerate(data):  
    x = eval(d)[&#39;article&#39;].strip() # x为一篇文章的字符串形式  
    data[i] = list(jieba.cut(x))  </code></pre>
<p>（3）加载字典，并去除最高频的200个词汇，因为这些词汇太普遍所以并不能够做主题词。</p>
<pre><code class="python">dictionary = Dictionary(data)  
dictionary.filter_n_most_frequent(200)  
corpus = [dictionary.doc2bow(text) for text in data ]  </code></pre>
<p>（4）训练LDA模型，并获取结果</p>
<pre><code class="python">lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=3)#抽取三个主题  
topic_list=lda.print_topics(3,5)#打印第一个主题排名前5的词汇  
for i in topic_list:  
    print(i)  </code></pre>
<p>代码输出为： </p>
<pre><code class="python">(0, &#39;0.003*&quot;她&quot; + 0.002*&quot;某某&quot; + 0.002*&quot;公司&quot; + 0.002*&quot;,&quot; + 0.002*&quot;你&quot;&#39;)  
(1, &#39;0.007*&quot;,&quot; + 0.005*&quot;公司&quot; + 0.002*&quot;生物&quot; + 0.002*&quot;康泰&quot; + 0.002*&quot;原种场&quot;&#39;)  
(2, &#39;0.003*&quot;黄海波&quot; + 0.002*&quot;豆芽&quot; + 0.002*&quot;她&quot; + 0.002*&quot;·&quot; + 0.002*&quot;提&quot;&#39;)  </code></pre>
<p>这里的0，1，2分别对应着模型提取出的三个主题，每个主题输出了排名前5的单词。<br>可见，我们虽然去除了词频最高的200个单词，但还存在着一些无意义的词汇，例如“她”、“你”等等，如提前过滤掉停用词效果会更好。</p>
<p>多啰嗦一句，如果再给定一篇新的文章，利用已经训练好的LDA模型可以得到新文章的主题分布，代码如下：  </p>
<pre><code class="python">article = &#39;就如六世达赖喇嘛仓英嘉措诗中说的一样：“世间安得两全法，不负如来不负卿！”是啊，世界上哪有两全其美的事呢！达赖喇嘛仓英嘉措的人生也是这样，十四岁被西藏摄政王第巴·桑结嘉措认定为五世达赖的转世灵童，从此只能青灯古佛，心向如来了。虽然说达赖喇嘛是西藏人们敬仰的存在，可是仓英嘉措自己想要做吗&#39;  
article = list(jieba.cut(article))  
article = dictionary.doc2bow  (article)      #文档转换成bow  
doc_lda = lda[article]  
print(doc_lda)  </code></pre>
<p>输出为：  </p>
<pre><code class="python">[(0, 0.4298588), (1, 0.5516107), (2, 0.018530471)]  </code></pre>
<p>表示主题0占比为43.0%，主题1占比为55%，主题2占比为2%。</p>
<p>最后补充一点：</p>
<blockquote>
<p>更好地使用LDA的方式是先利用短语挖掘识别出领域短语，再使用LDA，这实际上是Phrase-LDA，在实际应用中往往能够取得更好的效果。</p>
</blockquote>
<h2 id="2-4-RAKE"><a href="#2-4-RAKE" class="headerlink" title="2.4 RAKE"></a>2.4 RAKE</h2><p>RAKE（Rapid Automatic Keyword Extraction），其特点是速度快的同时也能取得相对不错的效果。<br>之前介绍的算法提取出的词都是单一的关键词，而RAKE算法提取出的则是单词所组成的短语。<br>需要注意的是：<strong>在中文上使用RAKE算法的效果并不好，因为分词会出现边界模糊的情况。因此只推荐在英文文本上用RAKE算法。</strong>  </p>
<p>我们用<u><a href="https://www.researchgate.net/publication/227988510_Automatic_Keyword_Extraction_from_Individual_Documents" target="_blank" rel="noopener">原论文</a></u>中的例子来解释其算法过程：<br><img src="/images/KW/4.jpg" alt="example"><br>这是原始文档以及人工标注的关键词<br>（1）得到候选关键词<br>第一步先从原始文档中抽取出候选的关键词，其过程以停用词和标点来分割源文档。分隔后的候选关键词如下：<br><img src="/images/KW/5.jpg" alt="候选关键词"><br>（2）计算单词共现矩阵<br>该过程与GLOVE中的类似，属于一劳永逸式的做法。<br>需要注意的是，该操作的单位是单词而不是上一步中的候选关键词。<br><img src="/images/KW/6.jpg" alt="单词共现矩阵"><br>（3）计算得分<br>首先计算每个单词的得分：<br><img src="/images/KW/7.jpg" alt="单词得分"><br>之后计算每个候选关键词的得分：<br><img src="/images/KW/8.jpg" alt="候选关键词得分"><br>每个候选关键词的得分就是把其包含的单词的得分（deg(w)/freq(w)）相加。<br>（4）最后输出得分高的候选关键词</p>
<p>再来看一下实战过程：  </p>
<p>RAKE源代码地址：<a href="https://github.com/aneesha/RAKE" target="_blank" rel="noopener">https://github.com/aneesha/RAKE</a>  </p>
<p>RAKE新代码地址：<a href="https://github.com/laserwave/keywords_extraction_rake" target="_blank" rel="noopener">https://github.com/laserwave/keywords_extraction_rake</a>  </p>
<p>其中源代码是RAKE论文提供的，而新代码是在源代码基础上改进得到的，并且支持python3.x语法。我们在此使用新代码进行演示。<br>首先下载新代码，在代码中有一个例子<br><img src="/images/KW/9.jpg" alt="RAKE"><br>我们直接命令行运行  </p>
<pre><code class="python">python rake.py example/input.txt example/stopwords.txt -o example/output.txt </code></pre>
<p>即可运行示例中的数据<br>示例的输入是两篇英文文章，一篇一行，输出是提取关键词后的数据，格式如下：<br><img src="/images/KW/10.jpg" alt="RAKE"><br>第一行显示的是第一篇文章的提取结果，第二行显示的是第二篇的关键词。 </p>
<hr>
<p>这个算法也有一个接口，详见：<u><a href="https://www.ctolib.com/rake-nltk.html" target="_blank" rel="noopener">《rake-nltk：Python实现使用NLTK的快速自动关键字提取算法》</a></u></p>
<h2 id="2-5-CKPE"><a href="#2-5-CKPE" class="headerlink" title="2.5 CKPE"></a>2.5 CKPE</h2><p>4.2.2020更新一个我才看到的算法<br>在2.4中我们介绍了一个应用于英文的短语抽取算法，在本小节中将介绍一种<strong>应用于中文的短语抽取算法</strong>。<br>CKPE：Chinese KeyPhrase Extractor  </p>
<blockquote>
<p>Repo：<a href="https://github.com/krystalan/chinese_keyphrase_extractor" target="_blank" rel="noopener">https://github.com/krystalan/chinese_keyphrase_extractor</a>   </p>
</blockquote>
<p>在Repo中有相关的使用方法和算法原理，使用到了分词和词性标注的工具，进行了tfidf的计算，并且融合了相邻的关键词，在权重计算的过程中使用到了LDA，这里就不过多介绍了，感兴趣的童鞋可以自己去看看。</p>
<h2 id="2-6-diff-idf"><a href="#2-6-diff-idf" class="headerlink" title="2.6 diff-idf"></a>2.6 diff-idf</h2><p><img src="/images/KW/11.jpg" alt="diff-idf"><br>这个是一篇2020AAAI中的方法，原论文题目是：《Keyword-Attentive Deep Semantic Matching》<br>论文和代码地址：<u><a href="https://github.com/DataTerminatorX/Keyword-BERT" target="_blank" rel="noopener">https://github.com/DataTerminatorX/Keyword-BERT</a></u><br>简述一下就是，先利用PMI发现新词与候选关键词，再计算diff-idf值，将值高的保留下来。需要注意的是，这里有一个领域的概念，一个单词的diff-idf值是在其余领域下的idf值减去当前领域下的idf值。<br>也就是对于不同的领域抽取关键词，最后抽取出的结果部分如下：<br><img src="/images/KW/12.jpg" alt="diff-idf">   </p>
<p>最后想对比一下diff-idf与LDA<br>首先这两个算法都是为了获取能够代表某一领域的高质量关键词。<br>但diff-idf需要预先知道有哪些类别，也就是说得先分好类，而LDA不用，但LDA需要凭经验或者观察去设置主题数。</p>
<h2 id="2-7-推荐"><a href="#2-7-推荐" class="headerlink" title="2.7 推荐"></a>2.7 推荐</h2><p>最后非常推荐刘知远老师的博士论文：<u><a href="http://xueshu.baidu.com/usercenter/paper/show?paperid=463f0161663fe810fa40d13b0e8eab11&site=xueshu_se" target="_blank" rel="noopener">《基于文档主题结构的关键词抽取方法研究》</a></u><br>虽然该文时间久远，但对文档关键词和文档标签有着非常全面的概括与理解。</p>
<h1 id="3-新词发现"><a href="#3-新词发现" class="headerlink" title="3.新词发现"></a>3.新词发现</h1><p>最后简单提一下另一个相关的任务<br>新词发现：由于互联网的普及，网络上时不时会出现一些新的词汇，利用新词发现技术可以快速识别出未在词表中的词汇。<br>其基本思路是利用互信息和左右熵  </p>
<p>更加详细的介绍请移步：<br><a href="https://www.jianshu.com/p/d24b6e197410" target="_blank" rel="noopener">https://www.jianshu.com/p/d24b6e197410</a><br><a href="https://github.com/zhanzecheng/Chinese_segment_augment" target="_blank" rel="noopener">https://github.com/zhanzecheng/Chinese_segment_augment</a>  </p>

            </div>

            <!-- Post Comments -->
            

        </div>
        <!-- Copyright 版权 start -->
                <div id="copyright">
            <ul>
                <li>&copy;2020 北望你的安. 版权所有</li>
            </ul>
            
                <span id="busuanzi_container_site_pv">本站总访问量<span id="busuanzi_value_site_pv"></span>次，</span>
				<span id="busuanzi_container_site_uv"> 访客数 <span id="busuanzi_value_site_uv"></span> 人. </span>
			
			<br>
			<span>友情链接：<a href='http://www.demilab.cn' target='_blank'>DEMI实验室</a>&nbsp;&nbsp;&nbsp;<a href='http://zd11024.cn/' target='_blank'>ZD</a></span>
        </div>
    </div>
</body>



 	
</html>
